/// Copyright 2007-8 Faraday Media
/// 
/// Licensed under the Apache License, Version 2.0 (the "License"); 
/// you may not use this file except in compliance with the License. 
/// You may obtain a copy of the License at 
/// 
///   http://www.apache.org/licenses/LICENSE-2.0 
/// 
/// Unless required by applicable law or agreed to in writing, software 
/// distributed under the License is distributed on an "AS IS" BASIS, 
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
/// See the License for the specific language governing permissions and 
/// limitations under the License.
using System;
using System.CodeDom;

namespace MetaSharp.XML.Strategies {
  /// <summary>
  /// Base class implemented by all strategies.
  /// </summary>
  public abstract class BaseStrategy : IStrategy {
    #region IStrategy Members
    /// <summary>
    /// Defines the priority of the strategy.
    /// </summary>
    public abstract StrategyPriority Priority { get; }
    #endregion

    /// <summary>
    /// Creates the CreateObjectExpression that can be used for assigning the element.
    /// </summary>
    /// <param name="pContext">the context of the generation</param>
    /// <param name="pReturnType">the interface type being generated to</param>
    /// <param name="pElementExpression">the expression used to fetch the element</param>
    /// <returns>an expression for creating the wrapper object</returns>
    protected CodeExpression CreateCreateObjectExpression(GenerationContext pContext, Type pReturnType, CodeExpression pElementExpression) {
      return new CodeObjectCreateExpression(
        pContext.LookupRequiredTypeName(pReturnType), 
        pElementExpression,
        new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "WrapperGenerator"));
    }
  }
}
